package net.atos.java.example.boodschappen.model;

import java.io.Serializable;
import java.math.BigDecimal;

/**
 * Beschrijft een boodschap.
 * 
 * @author Pal Hargitai
 */
public class Boodschap implements Serializable, Entity<String> {

	/** Serial id. */
	private static final long serialVersionUID = -5415912760718390599L;
	/** Identificatie. */
	private String identificatie;
	/** Gekoppelde gebruiker. */
	private String gebruiker;
	/** Boodschap. */
	private String boodschap;
	/** Hoeveelheid. */
	private BigDecimal hoeveelheid;
	/** Eenheid. */
	private HoeveelheidEenheid eenheid;

	public Boodschap() {
	}

	/** Verstopte constructor. */
	private Boodschap(Builder builder) {
		identificatie = builder.identificatie;
		gebruiker = builder.gebruiker;
		boodschap = builder.boodschap;
		hoeveelheid = builder.hoeveelheid;
		eenheid = builder.eenheid;
	}

	/** {@inheritDoc} */
	@Override
	public String getIdentificatie() {
		return identificatie;
	}

	/**
	 * Haalt de gebruiker waarde op.
	 * @return De gebruiker waarde.
	 */
	public String getGebruiker() {
		return gebruiker;
	}

	/**
	 * Haalt de boodschap waarde op.
	 * @return De boodschap waarde.
	 */
	public String getBoodschap() {
		return boodschap;
	}

	/**
	 * Haalt de hoeveelheid waarde op.
	 * @return De hoeveelheid waarde.
	 */
	public BigDecimal getHoeveelheid() {
		return hoeveelheid;
	}

	/**
	 * Haalt de eenheid waarde op.
	 * @return De eenheid waarde.
	 */
	public HoeveelheidEenheid getEenheid() {
		return eenheid;
	}

	/**
	 * Bewerkt de gebruiker identificatie van de boodschap.
	 * @param gebruiker De nieuwe gebruiker identificatie.
	 */
	public void bewerkGebruiker(String gebruiker) {
		this.gebruiker = gebruiker;
	}

	/**
	 * De boodschap bouwer.
	 * 
	 * @author Pal Hargitai
	 */
	public static class Builder {
		/** Identificatie. */
		private String identificatie;
		/** Gekoppelde gebruiker. */
		private String gebruiker;
		/** Boodschap. */
		private String boodschap;
		/** Hoeveelheid. */
		private BigDecimal hoeveelheid;
		/** Eenheid. */
		private HoeveelheidEenheid eenheid = HoeveelheidEenheid.GRAM;

		/**
		 * Bouwt de boodschap.
		 * @return De boodschap.
		 */
		public Boodschap build() {
			return new Boodschap(this);
		}

		/**
		 * Zet de gebruiker.
		 * @param gebruiker De nieuwe gebruiker.
		 * @return De builder.
		 */
		public Builder gebruiker(String gebruiker) {
			this.gebruiker = gebruiker;
			return this;
		}

		/**
		 * Zet de hoeveelheid.
		 * @param hoeveelheid De nieuwe hoeveelheid.
		 * @return De builder.
		 */
		public Builder hoeveelheid(BigDecimal hoeveelheid) {
			this.hoeveelheid = hoeveelheid;
			return this;
		}

		/**
		 * Zet de eenheid.
		 * @param hoeveelheidEenheid De nieuwe eenheid.
		 * @return De builder.
		 */
		public Builder hoeveelheidEenheid(HoeveelheidEenheid hoeveelheidEenheid) {
			this.eenheid = hoeveelheidEenheid;
			return this;
		}

		/**
		 * Zet de naam.
		 * @param naam De naam.
		 * @return De builder.
		 */
		public Builder naam(String naam) {
			this.boodschap = naam;
			return this;
		}

		/**
		 * Zet de identificatie.
		 * @param identificatie De identificatie.
		 * @return De builder.
		 */
		public Builder identificatie(String identificatie) {
			this.identificatie = identificatie;
			return this;
		}

		/**
		 * Haalt de identificatie waarde op.
		 * @return De identificatie waarde.
		 */
		public String getIdentificatie() {
			return identificatie;
		}

		/**
		 * Haalt de gebruiker waarde op.
		 * @return De gebruiker waarde.
		 */
		public String getGebruiker() {
			return gebruiker;
		}

		/**
		 * Haalt de boodschap waarde op.
		 * @return De boodschap waarde.
		 */
		public String getBoodschap() {
			return boodschap;
		}

		/**
		 * Haalt de hoeveelheid waarde op.
		 * @return De hoeveelheid waarde.
		 */
		public BigDecimal getHoeveelheid() {
			return hoeveelheid;
		}

		/**
		 * Haalt de eenheid waarde op.
		 * @return De eenheid waarde.
		 */
		public HoeveelheidEenheid getEenheid() {
			return eenheid;
		}
	}
}
